#include"apue.h"
static int msgid_ctos;
static int msgid_stoc;
Msg_ctos msg_ctos1;
Msg_ctos msg_ctos2;
Msg_stoc msg_stoc;

void transf_cli(void)
{
	char cli_path1[255] = {};
 	sprintf(cli_path1,"%s%u",ACCOUNT_PATH,msg_ctos1.m_cli.cliid);

	if(-1 == access(cli_path1,F_OK))
	{
		sprintf(msg_stoc.m_str,"帐号：%d 不存在",msg_ctos1.m_cli.cliid);
		return;
	}
	int fd1 = open(cli_path1,O_RDWR);
	if(-1 == fd1)
	{
		perror("open");
		sprintf(msg_stoc.m_str,"服务器正在升级，请稍候...");
		return;
	}
	if(0 >= read(fd1,&msg_ctos2.m_cli,sizeof(msg_ctos2.m_cli)))
	{
		perror("read");
		sprintf(msg_stoc.m_str,"服务器正在升级，请稍候...");
		return;
	}
	if(0 != strcmp(msg_ctos2.m_cli.passwd,msg_ctos1.m_cli.passwd))
	{
		sprintf(msg_stoc.m_str,"用户或密码错误...");
		return;
	}
	Msg_ctos msg_ctos3;
	char cli_path2[255] = {};
 	sprintf(cli_path2,"%s%s",ACCOUNT_PATH,msg_ctos1.m_cli.otherid);
	if(-1 == access(cli_path2,F_OK))
	{
		sprintf(msg_stoc.m_str,"帐号：%s 不存在",msg_ctos1.m_cli.otherid);
		return;
	}

	int fd2=open(cli_path2,O_RDWR);
	if(-1 == fd2)
	{
		perror("open");
		sprintf(msg_stoc.m_str,"服务器正在升级，请稍候...");
		return;
	}

	
	if(0 >= read(fd2,&msg_ctos3.m_cli,sizeof(msg_ctos3.m_cli)))
	{
		perror("read");
		sprintf(msg_stoc.m_str,"服务器正在升级，请稍候...");
		return;
	}
	if(msg_ctos2.m_cli.money<msg_ctos1.m_cli.money)
	{
		strcpy(msg_stoc.m_str,"余额不足！");
		return;
	}
	else
	{
		msg_ctos2.m_cli.money-=msg_ctos1.m_cli.money;
		msg_ctos3.m_cli.money+=msg_ctos1.m_cli.money;
		sprintf(msg_stoc.m_str,"转帐成功，请查收！余额：%f",
		msg_ctos2.m_cli.money);

		lseek(fd1,SEEK_SET,0);
		lseek(fd2,SEEK_SET,0);
		if(write(fd1,&msg_ctos2.m_cli,sizeof(msg_ctos2.m_cli))<=0)
		{
			perror("write");
		}
		if(write(fd2,&msg_ctos3.m_cli,sizeof(msg_ctos3.m_cli))<=0)
		{
			perror("write");
		}
		
	}
	close(fd1);
	close(fd2);
}

int main()
{
	msgid_ctos = get_ctos_msg();
	msgid_stoc = get_stoc_msg();

	while(1)
	{
		if(-1 == msgrcv(msgid_ctos,&msg_ctos1,sizeof(msg_ctos1),MTRANSF,0))
		{
			perror("msgrcv");
		}
		
		transf_cli();
		msg_stoc.m_type = msg_ctos1.m_pid;

		if(-1 == msgsnd(msgid_stoc,&msg_stoc,sizeof(msg_stoc.m_str),0))
		{
			perror("msgsnd");
		}
	}
}
